package indi.caspar.algorithms.sort;

import indi.caspar.algorithms.Sorts;

/**
 * 希尔排序
 * Created by casparhuan on 2017/6/18.
 */
public class ShellSorts {

    public static void sort(Comparable[] a){
        int h = 1;
        while (h < a.length / 3) h = 3*h + 1;

        while (h > 0) {
            for (int i = h; i < a.length; i++) {
                //插排
                int j = i;
                Comparable temp = a[j];
                for (; j > h-1 && SortsAlgUtil.less(temp,a[j-1]); j -= h) {
                    a[j] = a[j-h];
                }
                a[j] = temp;
            }
            h = h /3;
        }
    }
    public static void sort2(Comparable[] a){
        int h = 1;
        while (h < a.length / 3) h = 3*h + 1;

        while (h > 0) {
            for (int i = h; i < a.length; i++) {
                //插排
                for (int j = i; j>h-1 && SortsAlgUtil.less(a[j] , a[j-h])  ; j -=h) {
                    SortsAlgUtil.exch(a,j ,j-h);
                }
            }
            h = h /3;
        }
    }


    public static void main(String[] args) {
        String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
        String[] a2 = {"S","H","E","L","L","S","O","R","T","E","X","A","M","P","L","E"};
        String[] a3 = {"S","O","R","T","E","X","A","M","P","L","E"};
        String[] a4 = {"S","H","E","L","L","S","O","R","T","E","X","A","M","P","L","E"};
        sort(a);
        sort(a2);
        sort2(a3);
        sort2(a4);
        System.out.println(SortsAlgUtil.isSorted(a));
        System.out.println(SortsAlgUtil.isSorted(a2));
        System.out.println(SortsAlgUtil.isSorted(a3));
        System.out.println(SortsAlgUtil.isSorted(a4));
        SortsAlgUtil.show(a);
        SortsAlgUtil.show(a2);
        SortsAlgUtil.show(a3);
        SortsAlgUtil.show(a4);
    }
}
